home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
DB_CLIPP
/
0358.ZIP
/
DB3SCR1.ASM
< prev
next >
Wrap
Assembly Source File
|
1986-08-01
|
12KB
|
383 lines
.8086
; db3scr.asm
;
;
;
; *********************************************************
; * To: P.C. magazine *
; * *
; * try this utility out for dbase 3.... *
; * *
; * assemble/link/exe2bin this file *
; * *
; * then edit a dbase screen file (.prg) , insert a *
; * *
; * ? '~00007924' *
; * quit dbase then type in db3scr1 *
; * *
; * load dbase, then DO your program *
; * *
; * you will notice a box appear, this utility will *
; * intercept dbase interupt 10h function 9 calls *
; * (write character + attribute) and then check for *
; * the ~ character if found it will accept starting x,y *
; * locations for a box and xlen,ylen *
; * x y xlyl *
; * ? '~00007924' *
; * *
; * result: a very fast box maker in a rather slow *
; * interpreter *
; * *
; * Try it out, I stayed up lots of nights *
; * when I first got MASM. *
; * Hope it is of interest to your readers, It is not *
; * too long for typeing *
; * *
; * Sincerely *
; * *
; * Mark J Landy *
; * *
; * 137 Homewood Ave. *
; * Yonkers, N.Y. 10701 *
; * *
; * Programmer/ Consultant *
; * *
; * *
; * phone: 914 969-0934 *
; * *
; *********************************************************
;
;
;
;
;
;
;
;
;
;
;
; test for use of function 9h in in 10h
title db3scr.asm
page 60,132
UP_L EQU 201 ;ALL DOUBLE BARS
UP_R EQU 187
L_L EQU 200
L_R EQU 188
HORIZ EQU 205
VERT EQU 186
cseg segment
assume cs:cseg
org 0100h
ASSUME DS:CSEG
entry: jmp initialize
;
;all data
;
UPL_V_DH DB 0 ; CONST FOR ROW Y DH
UPL_H_DL DB 0 ; CONST FOR COL X DL
MAX_CHAR_H DB 0 ; LENGTH OF X VECTOR
MAX_CHAR_V DB 0 ; LENGTH OF Y VECTOR
R1CHARYES DB 0
R2CHARYES DB 0
R3CHARYES DB 0
R4CHARYES DB 0
R5CHARYES DB 0
R6CHARYES DB 0
R7CHARYES DB 0
R8CHARYES DB 0
TNUMBER DB 0
out_mess db '(c) 1986 Mark J Landy ',0ah,0dh,0ah,0dh
db '\/...db3 screen enhancement installed....\/','$'
cpyright db "(c) copyright 1986 Mark J Landy co."
oldinterrupt10 dd ?
;
BOX_LOOP:
CALL INIT_CODE
MOV DH,CS:[UPL_V_DH]
MOV DL,CS:[UPL_H_DL]
CALL SET_POS
MOV AL,HORIZ ; HORIZ LINE ASCII DOUBLE BAR
MOV CL,CS:[MAX_CHAR_H] ;UPPER
CALL SCR_PRINT
MOV DH,CS:[UPL_V_DH];+MAX_CHAR_V
ADD DH,CS:[MAX_CHAR_V]
MOV DL,CS:[UPL_H_DL]
CALL SET_POS
MOV AL,HORIZ ; HORIZ LINE ASCII DOUBLE BAR
MOV CL,CS:[MAX_CHAR_H] ;LOWER
CALL SCR_PRINT
MOV DH,CS:[UPL_V_DH]
MOV DL,CS:[UPL_H_DL]
CALL SET_POS
MOV AL,UP_L ;UPPER LEFT
MOV CL,1
CALL SCR_PRINT
MOV DH,CS:[UPL_V_DH];+MAX_CHAR_V
ADD DH,CS:[MAX_CHAR_V]
MOV DL,CS:[UPL_H_DL]
CALL SET_POS
MOV AL,L_L ;LOWER LEFT
MOV CL,1
CALL SCR_PRINT
MOV DH,CS:[UPL_V_DH];+MAX_CHAR_V
ADD DH,CS:[MAX_CHAR_V]
MOV DL,CS:[UPL_H_DL];+MAX_CHAR_H
ADD DL,CS:[MAX_CHAR_H]
CALL SET_POS
MOV AL,L_R ;LOWER RIGHT
MOV CL,1
CALL SCR_PRINT
MOV DH,CS:[UPL_V_DH]
MOV DL,CS:[UPL_H_DL];+MAX_CHAR_H
ADD DL,CS:[MAX_CHAR_H]
CALL SET_POS
MOV AL,UP_R ;UPPER RIGHT
MOV CL,1
CALL SCR_PRINT
;TWO VERTICAL LINES
MOV DH,CS:[UPL_V_DH]
MOV DL,CS:[UPL_H_DL]
CALL VERT_LOOP
MOV DH,CS:[UPL_V_DH]
MOV DL,CS:[UPL_H_DL] ; +MAX_CHAR_H
ADD DL,CS:[MAX_CHAR_H]
CALL VERT_LOOP
;RETURN TO ONE CHAR RIGHT AND BELOW OF
;BOX UPLH, UPLV
MOV DH,CS:[UPL_V_DH]
MOV DL,CS:[UPL_H_DL]
ADD DH,1
ADD DL,1
CALL SET_POS
RET ;END BOX LOOP
VERT_LOOP: ;ASSUMES CHARACTER IS IN AL
;AND NUMBER OF REPEATES IN CL
;CHECK LOOP BEGINS
INC DH
CALL SET_POS
MOV AL,VERT
MOV CL,1
CALL SCR_PRINT
MOV AH,CS:[UPL_V_DH] ;+MAX_CHAR_V-1
ADD AH,CS:[MAX_CHAR_V]
SUB AH,1
CMP AH,DH
JNZ VERT_LOOP
;CHECK LOOP ENDS
RET
INIT_CODE: ;SETS SCREEN TO UPPER LEFT CORNER
MOV AH,2
MOV BH,0
MOV DH,0
MOV DL,0
INT 10H
RET
SET_POS:
MOV AH,2
MOV BH,0 ;SCREEN PAGE
; MOV DH,POS ROW ASSUMES THAT REGISTER IS LOADED
; MOV DL,POS COL PRIOR TO CALL
INT 10H
RET
SCR_PRINT:
MOV AH,9 ;ASSUMES CHAR CODE IN AL REGISITER
MOV BH,0 ;PAGE NUMBER
MOV BL,7
; MOV CL,NUM_CHAR_FIL 80 CHAR
MOV CH,0 ; HIGH BIT OF CX REG
INT 10H ;VIDEO SERVICES ROUTINE BIOS
RET
; THE ABOVE ROUTINE ASSUME THE PRESENCE
;PRIOR TO CALLING SCR_PRINT YOU MUST
;LOAD AL WITH ASCII CHAR AND LOAD CL WITH DEC NUMBER OF REPEATS
;
; end of screen builds
;
;
R1CYES PROC NEAR
sub al,30h
mov cl,10
mul cl
mov cs:tnumber,al
mov cs:R1CHARYES,0
MOV CS:R2CHARYES,1
RET
R1CYES ENDP
R2CYES PROC NEAR
sub al,30h
add al,cs:[tnumber]
mov cs:upl_v_dh,al
mov cs:R2CHARYES,0
MOV CS:R3CHARYES,1
RET
R2CYES ENDP
R3CYES PROC NEAR
sub al,30h
mov cl,10
mul cl
mov cs:tnumber,al
mov cs:R3CHARYES,0
MOV CS:R4CHARYES,1
RET
R3CYES ENDP
R4CYES PROC NEAR
sub al,30h
add al,cs:[tnumber]
mov cs:upl_h_dl,al
mov cs:R4CHARYES,0
MOV CS:R5CHARYES,1
RET
R4CYES ENDP
R5CYES PROC NEAR
sub al,30h
mov cl,10
mul cl
mov cs:tnumber,al
mov cs:R5CHARYES,0
MOV CS:R6CHARYES,1
RET
R5CYES ENDP
R6CYES PROC NEAR
sub al,30h
add al,cs:[tnumber]
mov cs:max_char_h,al
mov cs:R6CHARYES,0
MOV CS:R7CHARYES,1
RET
R6CYES ENDP
R7CYES PROC NEAR
sub al,30h
mov cl,10
mul cl
mov cs:tnumber,al
mov cs:R7CHARYES,0
mov cs:R8CHARYES,1
RET
R7CYES ENDP
R8CYES PROC NEAR
sub al,30h
add al,cs:[tnumber]
mov cs:max_char_v,al
mov cs:R8CHARYES,0
RET
R8CYES ENDP
newinterrupt10 proc far
cmp ah,9
jz checkchar
jmp cs:[oldinterrupt10]
checkchar:
CMP AL,'~'
JZ CS:SETR1CHAR
push ax
push bx
push cx
push dx
push di
push ds
push es
cmp cs:[R1CHARYES],1
jz GOC1 ;1ST
CMP CS:[R2CHARYES],1
JZ GOC2 ;2ND
CMP CS:[R3CHARYES],1
JZ GOC3 ;3RD
CMP CS:[R4CHARYES],1
JZ GOC4 ;4TH
CMP CS:[R5CHARYES],1
JZ GOC5 ;5TH
CMP CS:[R6CHARYES],1
JZ GOC6 ;6TH
CMP CS:[R7CHARYES],1
JZ GOC7 ;7TH
CMP CS:[R8CHARYES],1
JZ GOC8 ;8TH
pop es
pop ds
pop di
pop dx
pop cx
pop bx
pop ax
mov ah,9
jmp cs:[oldinterrupt10]
exit_10:
pop es
pop ds
pop di
pop dx
pop cx
pop bx
pop ax
mov ah,9
mov al,32
jmp cs:[oldinterrupt10]
SETR1CHAR:
mov cs:R1CHARYES,1
mov al,32
jmp cs:[oldinterrupt10]
GOC1:
CALL NEAR PTR R1CYES
JMP CS:EXIT_10
GOC2:
CALL NEAR PTR R2CYES
JMP CS:EXIT_10
GOC3:
CALL NEAR PTR R3CYES
JMP CS:EXIT_10
GOC4:
CALL NEAR PTR R4CYES
JMP CS:EXIT_10
GOC5:
CALL NEAR PTR R5CYES
JMP CS:EXIT_10
GOC6:
CALL NEAR PTR R6CYES
JMP CS:EXIT_10
GOC7:
CALL NEAR PTR R7CYES
JMP CS:EXIT_10
GOC8:
CALL NEAR PTR R8CYES
call box_loop
JMP CS:EXIT_10
; begin of screen builds
;
newinterrupt10 endp
;
;
;initialization
initialize:
push cs
pop ds
mov dx,offset out_mess
mov ah,9
int 21h
sub ax,ax
mov ds,ax
les bx,dword ptr ds:[10h * 4]
mov word ptr cs:[oldinterrupt10],bx
mov word ptr cs:[oldinterrupt10 + 2],es
push cs
pop ds
mov dx,offset newinterrupt10
mov ax,2510h
int 21h
mov dx,offset initialize
int 27h ;terminate but stay resident
cseg ends
end entry
ze
int